package com.atguigu.gmall.common.config;


import com.atguigu.gmall.common.cache.BloomName;
import com.atguigu.gmall.common.constant.RedisConst;
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * matchIfMissing = true： 没配置就是true，不配就是默认生效
 * @ConditionalOnProperty: 配置文件中有指定的 prefix.name 属性，、
 *   并且值是 havingValue 指定的，则@Configuration 生效。
 *
 *   1、引入redisson依赖
 *   2、给容器中放一个 RedissonClient，以后用他操作redis。
 *
 *
 *   redisson 做出来的锁，API都和JUC一样。
 *   JUC是本地锁；读写锁、信号量、可重入锁
 *   Redisson是分布式锁；
 *
 *
 */
@ConditionalOnProperty(prefix = "redisson", name = "enable",
        havingValue = "true", matchIfMissing = true)
@Configuration
public class ItemServiceRedissonConfig {

//    Lock lock = new ReentrantLock();  对象一样是同一把锁

    /**
     * 给容器中放一个操作redis的客户端，redisson工具
     * 1、这个方法的参数 RedisProperties ，Spring会自动从容器中获取
     *
     * @return
     */
    @Bean
    public RedissonClient redissonClient(RedisProperties redisProperties) {
//        RedissonClient redisson = Redisson.create();   //连接本地redis

        String host = redisProperties.getHost();
        int port = redisProperties.getPort();
        String password = redisProperties.getPassword();
        // redis:// or rediss://
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port)
                .setPassword(password)
                ;

//        long timeout = config.getLockWatchdogTimeout();   //看门狗时间用来自动续期
        RedissonClient redisson = Redisson.create(config);

        return redisson;
    }


    /**
     * 提前准备的布隆过滤器
     * @param redissonClient
     * @return
     */
//    @Primary
    @Bean(value = BloomName.SKU)  //每个bean的id就是方法名
    public RBloomFilter<Object> skufilter(RedissonClient redissonClient){
        //sku的布隆过滤器
        RBloomFilter<Object> bloomFilter = redissonClient.getBloomFilter(RedisConst.SKUKEY_PREFIX);
        //用之前要初始化, 系统重启不会被覆盖
        bloomFilter.tryInit(1000000L,0.001);

//        bloomFilter.migrate();  //重新创建的布隆
        return bloomFilter;
    }


    @Bean(value = BloomName.SPU)
    public RBloomFilter<Object> userfilter(RedissonClient redissonClient){
        //sku的布隆过滤器
        RBloomFilter<Object> bloomFilter = redissonClient.getBloomFilter(RedisConst.USER_KEY_PREFIX);
        //用之前要初始化
        bloomFilter.tryInit(100000L,0.01);
        return bloomFilter;
    }



}
